#pragma once
#include<iostream>
#include<string>
#include<unistd.h>
#include<cstdio>
#include<cstdlib>
#include<pthread.h>

using namespace std;

typedef void*(*func_t)(void*);
class ThreadData
{
public: 
    string _name;
    void* _args;
};
class Thread
{
public: 
    Thread(int num,func_t callback,void* args)
    :_func(callback)
    {
        //在初始化线程的时候就已经传入了工作函数
        char namebuffer[1024];
        snprintf(namebuffer,sizeof(namebuffer),"Thread-%d",num);
        _name=namebuffer;
        _tdata._args=args;
        _tdata._name=_name;
    }
    void start()
    {
        pthread_create(&_tid,nullptr,_func,(void*)&_tdata);
    }
    void join()
    {
        pthread_join(_tid,nullptr);
    }
    ~Thread()
    {
        
    }
private:
    func_t _func;
    string _name;
    ThreadData _tdata;
    pthread_t _tid;
};
// typedef void*(*func_t)(void*);
// class ThreadData
// {
// public:
//     string _name;
//     void* _args;
// };
// class Thread
// {
// public:
//     //在对线程进行初始化的时候就要传入工作函数的参数，只不过这个参数只是工作函数参数的一部分内容
//     Thread(int num,func_t callbacks,void* args)
//     :_func(callbacks)
//     {
//         char namebuffer[1024];
//         snprintf(namebuffer,sizeof(namebuffer),"Thread-%d",num);
//         _name=namebuffer;
//         //这里是工作函数的参数
//         _tdata._args=args;
//         _tdata._name=_name;
//     }
//     void start()
//     {
//         pthread_create(&_tid,nullptr,_func,(void*)&_tdata);
//     }
//     void join()
//     {
//         pthread_join(_tid,nullptr);
//     }
//     string name()
//     {
//         return _name;
//     }
//     ~Thread()
//     {

//     }
// private:
//     func_t _func;
//     ThreadData _tdata;
//     string _name;
//     pthread_t _tid;
// };
// typedef void*(*func_t )(void*);
// class ThreadData
// {
// public:
//     string _name;
//     void* _args;
// };
// class Thread
// {
// public:
//     Thread(int num,func_t callback,void* args)
//     :_func(callback)
//     {
//         char namebuffer[1024];
//         snprintf(namebuffer,sizeof(namebuffer),"Thread-%d",num);
//         _name=namebuffer;
//         _tdata._args=args;
//         _tdata._name=_name;
//     }
//     void start()
//     {
//         pthread_create(&_tid,nullptr,_func,&_tdata);
//     }
//     void join()
//     {
//         pthread_join(_tid,nullptr);
//     }
//     ~Thread()
//     {
        
//     }
// private:
//     string _name;
//     pthread_t _tid;
//     pthread_mutex_t _lock;
//     pthread_cond_t _cond;
//     func_t _func;
//     ThreadData _tdata;
// };
